import pymongo
from sqlalchemy.orm.collections import collection

from exts import all_logger
class DataBase:
    def __init__(self , DataBasename , DataTable):
        client = pymongo.MongoClient('localhost')
        db = client[DataBasename]
        self.collection = db[DataTable]
        all_logger.info(f"数据库连接成功,成功链接{db}数据库,{self.collection}数据表")
    def find(self, data):
        try :
            data = self.collection.find_one(data)
            all_logger.info(f"数据表{self.collection}查找数据成功,查找数据为{data}")
            return data
        except Exception as e:
            all_logger.error(f"数据表{self.collection}未找到数据,失败原因为{e}")
            return None
    def insert(self , data , unique_key = None):

        if unique_key is not None and self.find({unique_key:data[unique_key]}) is not None:
            all_logger.info(f"数据表{self.collection}插入数据失败,数据已存在,建议使用update方法,插入数据为{data},已存在数据为{self.find({unique_key:data[unique_key]})}")
            return None
        try :
            self.collection.insert_one(data)
            all_logger.info(f"数据表{self.collection}插入数据成功,插入数据为{data}")
        except Exception as e:
            all_logger.error(f"数据表{self.collection}插入数据失败,失败原因为{e}")
            return None
    def update(self , data , unique_key):
        if self.find({unique_key:data[unique_key]}) is None:
            all_logger.info(f"数据表{self.collection}更新数据失败,数据不存在,建议使用insert方法,更新数据为{data}")
            return None
        try :
            self.collection.update_one({unique_key:data[unique_key]},{"$set":data})
            all_logger.info(f"数据表{self.collection}更新数据成功,更新数据为{data}")
        except Exception as e:
            all_logger.error(f"数据表{self.collection}更新数据失败,失败原因为{e}")
            return None
    def list_append(self,data,unique_key,part_key):
        if self.find({unique_key:data[unique_key]}) is None:
            all_logger.info(f"数据表{self.collection}更新数据失败,数据不存在,建议使用insert方法,更新数据为{data}")
            return None
        try :
            self.collection.update_one({unique_key:data[unique_key]},{"$push":{part_key:data}})
            all_logger.info(f"数据表{self.collection}更新数据成功,list_append方法更新数据为{data}")
        except Exception as e:
            all_logger.error(f"数据表{self.collection}list_append方法更新数据失败,失败原因为{e}")
            return None
    def list_delete(self,data,unique_key,part_key):
        if self.find({unique_key:data[unique_key]}) is None:
            all_logger.info(f"数据表{self.collection}更新数据失败,数据不存在,建议使用insert方法,更新数据为{data}")
            return None
        try :
            self.collection.update_one({unique_key:data[unique_key]},{"$pull":{part_key:data}})
            all_logger.info(f"数据表{self.collection}更新数据成功,list_delete方法更新数据为{data}")
        except Exception as e:
            all_logger.error(f"数据表{self.collection}list_delete方法更新数据失败,失败原因为{e}")
            return None
"""
1.初始化  


CaptchaDB  = DataBase("blog","captcha")

collection = DataBase("blog","blog")
collection.find(data= {"title":"test"} 这类字典数据作为查询依据)
collection.insert(data=插入内容(字典数据) ,unique_key= {"title":"test"} 这类字典数据寻找是否有重复的内容 )
collection.update(data=更新内容(字典数据) ,unique_key= {"title":"test"} 这类字典数据寻找需要被更新的内容 )
collection.list_append(data=更新内容(字典数据,各类数据都行) ,unique_key= {"title":"test"} 这类字典数据寻找需要被更新的内容的列表 ,part_key= "tags"(需要被修改的数组))

"""
